%%% Local Variables:
%%% coding: utf-8
%%% mode: latex
%%% TeX-engine: xetex
%%% End:

\documentclass[14pt, a4paper]{extreport}

\usepackage{graphicx}
\DeclareGraphicsExtensions{.jpg}

\usepackage{hyperref}

\usepackage{mathtext}
\usepackage[utf8]{inputenc}

\usepackage{unicode-math}
\setmathfont{XITSMath-Regular.otf}

\usepackage{amsfonts}
\usepackage{amsmath}

\usepackage[english,russian]{babel}

\usepackage{fontspec} 
\defaultfontfeatures{Ligatures={TeX},Renderer=Basic}
\setmainfont[Ligatures={TeX,Historic}]{Times New Roman}

\usepackage{xcolor}

\usepackage{tabularx}

\setlength{\parindent}{1.25cm}
\usepackage{indentfirst} %отступ первой строки первого абзаца
%\linespread{1.25}

\usepackage{geometry}
\geometry{left=3cm}
\geometry{right=1.5cm}
\geometry{top=2cm}
\geometry{bottom=2cm}

\hypersetup{
    colorlinks,
    citecolor=black,
    filecolor=black,
    linkcolor=black,
    urlcolor=black
}

\usepackage{titlesec} % оформление заголовков

\titleformat{\chapter}[block]
	{\centering\bfseries}
        {\thechapter}
        {}
	{\MakeUppercase}
\titleformat{\section}[block]
	{\newpage\centering\bfseries}
        {\thesection}
        {1em}{}
\titleformat{\subsection}[block]
	{\bfseries}
        {\thesubsection}
        {1em}{}

% Оформление содержания
\usepackage{titletoc}
\dottedcontents{section}[0cm]{}{1em}{0.25pc}
\dottedcontents{subsection}[1.25cm]{}{2em}{0.25pc}
\dottedcontents{chapter}[0cm]{}{1em}{0.25pc}

\usepackage{caption}
\DeclareCaptionLabelSeparator{defffis}{ --- }
\captionsetup{labelsep=defffis}
\captionsetup[figure]{justification=centering,labelsep=defffis, labelformat=empty}
\captionsetup[table]{justification=raggedright, singlelinecheck=off}

\usepackage{array}
\newcommand\ChangeRT[1]{\noalign{\hrule height #1}}

\renewcommand{\thechapter}{\hspace*{-1em}}
\renewcommand{\thesection}{\arabic{section}}

\usepackage{setspace}

\begin{document}
\def\contentsname{СОДЕРЖАНИЕ}

\begin{titlepage}
\newpage
\begin{figure}[h!]
    \centering
    \includegraphics[scale=0.3]{MIREA_GERB}
\end{figure}
\vspace{-0.7cm}
\begin{center}
\small МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ \\
Федеральное государственное бюджетное образовательное учреждение \\
высшего образования \\
\textbf{''МИРЭА - Российский технологический университет''} \\
    \vspace{0.25cm}
\large     \textbf{РТУ МИРЭА} \\
\end{center}
    \vspace{0.25cm}
\hrule
    \vspace{0.05cm}
\hrule
\begin{center}
\small Институт кибернетики \\
    Кафедра общей информатики \\
\end{center}
    \vspace{2em}
\begin{center}
\large \textbf{ОТЧЕТ} \\
\large \textbf{ПО ПРАКТИЧЕСКОЙ РАБОТЕ №12} \\
\large <<Элементы алгоритмизации и процедурного программирования>> \\
\large \textbf{по дисциплине} \\
\large <<ИНФОРМАТИКА>> \\
\end{center}
    \vspace{5em}
\begin{flushleft}
\small Выполнил студент группы ИВБО-02-21 \hfill Иванов И.М. \\
\vspace{2em}
\small Принял старший преподаватель \hfill Смирнов С.С. \\
    \vspace{3em}
\end{flushleft}
\begin{flushleft}
\hspace{0.05\textwidth}\footnotesize Практическая \hspace{0.25\textwidth} <<\underline{\hspace{0.025\textwidth}}>>\underline{\hspace{0.09\textwidth}}2021 г. \hspace{0.15\textwidth} \underline{\hspace{0.15\textwidth}} \\
    \vspace{0.75em}
\hspace{0.05\textwidth}работа выполнена \\
    \vspace{1em}
\hspace{0.15\textwidth}\footnotesize <<Зачтено>> \hspace{0.185\textwidth} <<\underline{\hspace{0.025\textwidth}}>>\underline{\hspace{0.09\textwidth}}2021 г. \hspace{0.15\textwidth} \underline{\hspace{0.15\textwidth}}
	\vspace{5em}
\end{flushleft}
\begin{center}
	\small Москва 2021
\end{center}
\end{titlepage}
\begin{spacing}{1.5}
\setcounter{page}{2}
\tableofcontents
\section{ПОСТАНОВКА ЗАДАЧИ}
Требуется разработать блок-схему алгоритма и написать программу обработки данных в соответствии с выбранным и согласованным с преподавателем вариантом (вариант 2.15). При этом требуется контролировать типы и диапазоны вводимых данных, а также предусмотреть обработку других исключительных ситуаций  (если  они  есть),  например,  ситуацию  деления  на  ноль.  Блок-схема должна быть полной, т.е. должна описывать и процесс диалога с пользователем, и контроль вводимых данных, и подпрограммы вычислений с обработкой возможных исключительных операций. Блок-схема должна изображаться по ГОСТу.  При  обнаружении  ошибки  ввода  или  ошибки  вычислений программа должна  информативно  уведомлять  пользователя  о  причине  ошибки.  Если ошибка произошла на этапе ввода данных, то программа должна просить пользователя повторить ввод. 

Вариант задачи:

2.15.Создать квадратную матрицу размера MxM, где Mявляется целым числом из диапазона [2,5]. Конкретный размер матрицы задается пользователем. Матрица должна содержать слова из 4х букв английского алфавита, которые могут быть как случайными, так и вводиться пользователем. Полученную матрицу обработать следующим образом. Из каждого слова удалить все гласные буквы. Результат удаления вывести на экран. На основе измененной матрицы сформировать массив, состоящий из размеров строк матрицы, который необходимо упорядочить по убыванию. Результаты обработки вывести на экран.
\section{ПРОЕКТИРОВАНИЕ И РЕАЛИЗАЦИЯ}
\subsection{Блок-схема алгоритма программы, выполненная по ГОСТу}
Программа работает следующим образом: пользователь вводит размер матрицы (при этом программа учитывает запрещённые значения и просит пользователя ввести данные снова), далее генерируются слова из 4 букв при помощи генератора псевдослучайных чисел, программа обрабатывает данный массив данных и удаляет гласные буквы английского алфавита, создаётся массив размеров обработанных слов и он сортируется пузырьком. Полученные данные выводятся на экран. Далее изображена блок-схема программы (рис \ref{fig:scheme1}, \ref{fig:scheme2}, \ref{fig:scheme3}, \ref{fig:scheme4}).

\begin{figure}[htp]
  \centering
  \includegraphics[scale=1.0]{lab12-scheme-1}
  \caption{Рисунок 1 --- Элемент блок-схемы программы}
  \label{fig:scheme1}
\end{figure}
\begin{figure}[htp]
  \centering
  \includegraphics[scale=1.0]{lab12-scheme-2}
  \caption{Рисунок 2 --- Продолжение 1 блок-схемы программы}
  \label{fig:scheme2}
\end{figure}
\begin{figure}[htp]
  \centering
  \includegraphics[scale=1.0]{lab12-scheme-3}
  \caption{Рисунок 3 --- Продолжение 2 блок-схемы программы}
  \label{fig:scheme3}
\end{figure}
\begin{figure}[htp]
  \centering
  \includegraphics[scale=1.0]{lab12-scheme-4}
  \caption{Рисунок 4 --- Продолжение 3 блок-схемы программы}
  \label{fig:scheme4}
\end{figure}

\subsection{Структурированный код с комментариями}
Ниже показан код программы на языке C++.

\begin{verbatim}
#include<iostream>
#include<string>
#include<time.h>

using namespace std;

int main() {
    int M;
    cout << "Введите размер матрицы в пределах [2,5]:\n";
    cin >> M;
    string words[M][M];
    while(M < 2 || M > 5) {
        cout << "Вы ввели неверный размер, введите снова:\n";
        cin >> M;
    }
    // Генерация матрицы слов
    srand(time(NULL));
    for(int i = 0; i < M; i++) {
        for(int j = 0; j < M; j++) {
            words[i][j] += (char)(rand() % 26 + 65);
            for(int k = 1; k < 4; k++) {
                words[i][j] += (char)(rand() % 26 + 97);
            } 
        }
    }
    cout << "Сгенерированная матрица:\n";
    for(int i = 0; i < M; i++) {
        for(int j = 0; j < M; j++) {
            cout << words[i][j] << ' ';
        }
        cout << endl;
    }
    // Удаление гласных букв в матрице
    for(int i = 0; i < M; i++) {
        for(int j = 0; j < M; j++) {
            int k = 0;
            while(k < words[i][j].size()) {
                if(words[i][j][k] == 'a' || words[i][j][k] == 'A' ||
                   words[i][j][k] == 'e' || words[i][j][k] == 'E' ||
                   words[i][j][k] == 'u' || words[i][j][k] == 'U' ||
                   words[i][j][k] == 'o' || words[i][j][k] == 'O' ||
                   words[i][j][k] == 'i' || words[i][j][k] == 'I') {
                    words[i][j].erase(words[i][j].begin() + k);
                    k = 0;
                } else {
                    k++;
                }
            }
        }
    }
    cout << "\nОбработанная матрица:\n";
    for(int i = 0; i < M; i++) {
        for(int j = 0; j < M; j++) {
            cout << words[i][j] << ' ';
        }
        cout << endl;
    }
    // Массив размеров слов в обработанной матрице с сортировкой
    int count[M*M];
    for(int j = 0; j < M; j++) {
        for(int i = 0; i < M; i++) {
            count[j*M + i] = words[i][j].size();
        }
    }
    for(int i = 0; i < M*M - 1; i++) {
        for(int j = i + 1; j < M*M; j++)
        if(count[i] < count[j]) {
            int buf = count[i];
            count[i] = count[j];
            count[j] = buf;
        }
    }
    cout << "\nОтсортированный массив размеров обработанных слов:\n";
    for(int i = 0; i < M*M; i++) {
        cout << count[i] << ' ';
    }
    cout << endl;

    return 0;
}
\end{verbatim}

\subsection{Примеры тестирования, показывающие работоспособность}
На рис.\ref{fig:output} изображен пример работы программы. 

\begin{figure}[htp]
  \centering
  \includegraphics[scale=1.0]{lab12-output}
  \caption{Рисунок 5 --- Пример работы программы}
  \label{fig:output}
\end{figure}

Как видно, программа учитывает запрещённые данные. Тестирование показало её работоспособность.

\section{ВЫВОДЫ}

В ходе данной практической работы была реализованна программа на языке программирования C++ на основе раннее созданной блок-схемы. Программа учитывает запрещённые данные. Тестирование показало её работоспособность.

\section{СПИСОК ИНФОРМАЦИОННЫХ ИСТОЧНИКОВ}
1. Смирнов С.С., Карпов Д.А. Информатика: Методические указания по
выполнению практических работ. / С.С. Смирнов, Д.А. Карпов—М., МИРЭА —
Российский технологический университет, 2020.–102с.

2. Воронов Г.Б. Лекции по информатике. / Г.Б. Воронов. –М.: МИРЭА —
Российский технологический университет, 2021.: URL: https://online-edu.mirea.ru/mod/webinars/view.php?id=262229 (дата обращения 11.11.2021)

